/**
 * @FileName: 1380_lucky-numbers-in-a-matrix.go
 * @Description: 1380. 矩阵中的幸运数
给你一个 m * n 的矩阵，矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。

幸运数是指矩阵中满足同时下列两个条件的元素：

在同一行的所有元素中最小
在同一列的所有元素中最大


示例 1：

输入：matrix = [[3,7,8],[9,11,13],[15,16,17]]
输出：[15]
解释：15 是唯一的幸运数，因为它是其所在行中的最小值，也是所在列中的最大值。
示例 2：

输入：matrix = [[1,10,4,2],[9,3,8,7],[15,16,17,12]]
输出：[12]
解释：12 是唯一的幸运数，因为它是其所在行中的最小值，也是所在列中的最大值。
示例 3：

输入：matrix = [[7,8],[1,2]]
输出：[7]


提示：

m == mat.length
n == mat[i].length
1 <= n, m <= 50
1 <= matrix[i][j] <= 10^5
矩阵中的所有元素都是不同的

https://leetcode-cn.com/problems/lucky-numbers-in-a-matrix/

 * @Author: shouzimu
 * @Date: 2022/2/15 11:02
*/
package main

import (
	"fmt"
	"math"
)

/**
找出每一行和每一列的最大值最小值
因为每个数都不相同，只需要找出行列中一样的值就是答案
*/
func luckyNumbers(matrix [][]int) []int {
	m, n := len(matrix), len(matrix[0])
	row, col := make([]int, m), make([]int, n)
	for i, _ := range row {
		row[i] = math.MaxInt
	}
	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			v := matrix[i][j]
			if v > col[j] {
				col[j] = v
			}
			if v < row[i] {
				row[i] = v
			}
		}
	}
	res := make([]int, 0)
	for _, v1 := range col {
		for _, v2 := range row {
			if v1 == v2 {
				res = append(res, v1)
			}
		}
	}

	return res
}

func main() {
	fmt.Println(luckyNumbers([][]int{{1, 10, 4, 2}, {9, 3, 8, 7}, {15, 16, 17, 12}}))
	fmt.Println(luckyNumbers([][]int{{3, 7, 8}, {9, 11, 13}, {15, 16, 17}}))
}
